package algorithm.sort;

import java.util.Arrays;

/**
 * 希尔排序
 * 
 * @author jyzjyz12@163.com
 * @since 2017年3月7日 下午3:46:20
 */
public class ShellSortTest1 {
    public static void main(String[] args) {
        int[] arr1 = { 4, 7, 5, 6, 1, 3, 8 };
        int[] arr2 = { 7, 6, 5, 4, 3, 2, 1 };
        int[] arr3 = { 5, 9, 3, 7, 8, 6, 1, 2, 4 };
        int[] arr4 = { 13, 2, 5, 4, 88, 76, 68, 87, 55, 88, 88, 77, 67, 99, 100, 5, 53, 52, 51, 66 };
        int[] arr5 = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 1 };
        sort(arr1);
        sort(arr2);
        sort(arr3);
        sort(arr4);
        sort(arr5);
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        System.out.println(Arrays.toString(arr3));
        System.out.println(Arrays.toString(arr4));
        System.out.println(Arrays.toString(arr5));
    }

    public static void sort(int[] arr) {
        // 第一层for把一个大数组拆分成了N个小数组,再每个小数组里进行插入排序,然后修改分组规则减小小数组长度,再进行拆分和插入排序,直到拆分的小数组长度为2截止(相邻2个元素进行插入排序)
        for (int size = arr.length / 2; size >= 1; size = size / 2) {
            // 下面这个for和插入排序的逻辑完全一样
            for (int i = size; i < arr.length; i++) {
                // 不用whille用下面注释掉的for循环也可以.我用while是因为之前的插入排序用了while.这里保持一致好记一点.
                // int value = arr[i];
                // int j = i - size;
                // for (; j >= 0; j = j - size) {
                // if (value >= arr[j]) {
                // break;
                // } else {
                // arr[j + size] = arr[j];
                // }
                // }
                // arr[j + size] = value;
                int value = arr[i];
                int j = i;
                while (j - size >= 0 && value < arr[j - size]) {
                    arr[j] = arr[j - size];
                    j = j - size;
                }
                arr[j] = value;
            }
        }
    }
}
